package linc.cool.usage;

import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author yqlin
 * @date 2021/12/16 4:51 PM
 * @description 分析: 这种场景就是对象锁失效的场景，原因出在访问的是两个对象的同步方法，
 * 那么这两个线程分别持有的两个线程的锁，所以是互相不会受限的。
 * 加锁的目的是为了让多个线程竞争同一把锁，而这种情况多个线程之间不再竞争同一把锁，而是分别持有一把锁
 * 两个个线程同时访问两个对象的同步方法，是线程不安全的
 */
@Slf4j
public class 两个线程同时访问两个对象的同步方法 implements Runnable {
    private static final 两个线程同时访问两个对象的同步方法 INSTANCE_ONE = new 两个线程同时访问两个对象的同步方法();
    private static final 两个线程同时访问两个对象的同步方法 INSTANCE_TWO = new 两个线程同时访问两个对象的同步方法();

    @SneakyThrows
    @Override
    public void run() {
        method();
    }

    private synchronized  void method() throws InterruptedException {
        log.debug("{} 执行开始", Thread.currentThread().getName());
        TimeUnit.SECONDS.sleep(4);
        log.debug("{} 执行结束", Thread.currentThread().getName());
    }

    // 结果 两个线程是并行执行的，所以线程不安全。
    @SneakyThrows
    public static void main(String[] args) {
        Thread t1 = new Thread(INSTANCE_ONE);
        Thread t2 = new Thread(INSTANCE_TWO);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        log.debug("end");
    }
}
